package com.ccys.common.third.mailGun;

import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import lombok.Getter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CompletableFuture;

/**
 * @program: WhiteCoat
 * @description: Mailgun邮件发送工具类
 * @author: ZhangJingCan
 * @create: 2023-12-21 11:00
 **/
@Getter
public class MailgunUtil {

    // 日志记录器
    private static final Logger log = LoggerFactory.getLogger(MailgunUtil.class);

    // Mailgun的API基础URL
    private static final String MAILGUN_API_BASE_URL = "https://api.mailgun.net/v3";
    // 你的Mailgun域名
    private static final String MAILGUN_DOMAIN = "/mg.whitecoat.com.sg";
    // 你的Mailgun API密钥
    private static final String MAILGUN_API_KEY = "7b8670a905033693a9e5b728da084463-e51d0a44-e96b2fbb";

    /**
     * 高级优惠卷邮件主题
     */
    private static final String PROMO_CODE_AUTOMATED_SUBJECT = "Here's How You can Apply Your WhiteCoat Corporate Healthcare Benefit";
    private static final String APP_NAME = "WhiteCoat";

    /**
     * 发件人邮箱
     */
//    private static final String FROM_EMAIL = "no-reply@whitecoat.global";
    private static final String FROM_EMAIL = "test@whitecoat.global";

    public static final String QA_DEV_EMAIL = "yauboon.tan@whitecoat.global,hien.nguyen+1@whitecoat.global,tran.van+50@whitecoat.global";

    public static final String QA_PROD_EMAIL = "corporatesolutions@whitecoat.global";

    public static void sendEmailAsync(String toEmail, String subject, String text, String html){
        CompletableFuture.runAsync(() -> {
            try {
                sendEmail(toEmail,subject,text,html);
            }catch (Exception e){
                log.error("发送邮件异常,",e);
            }
        });
    }

    public static void sendEmailAsync(String toEmail, String subject, String text, String html, Map<String, String> map){
        CompletableFuture.runAsync(() -> {
            try {
                sendEmail(toEmail,subject,text,html,map);
            }catch (Exception e){
                log.error("发送邮件异常,",e);
            }
        });
    }

    /**
     * 发送邮件
     *
     * @param toEmail 收件人邮箱
     * @param subject 邮件主题
     * @param text    邮件正文（纯文本）
     * @param html    邮件正文（HTML格式）
     * @return 发送成功返回true，失败返回false
     */
    public static boolean sendEmail(String toEmail, String subject, String text, String html) {

        // 设置请求参数
        Map<String, Object> form = new HashMap<>();
        form.put("from", FROM_EMAIL);
        form.put("to", toEmail);
        form.put("subject", subject);

        // 如果提供了纯文本内容，则添加到参数中
        if (StrUtil.isNotBlank(text)) {
            form.put("text", text);
        }
        // 如果提供了HTML内容，则添加到参数中
        if (StrUtil.isNotBlank(html)) {
            form.put("html", html);
        }

        // 构建请求URL
        String url = StrUtil.format("{}{}/messages", MAILGUN_API_BASE_URL, MAILGUN_DOMAIN);

        // 发送POST请求
        HttpResponse response = HttpRequest.post(url)
                .basicAuth("api", MAILGUN_API_KEY) // 添加HTTP基本认证
                .form(form)                        // 添加表单数据
                .execute();

        try {
            // 判断响应状态码是否为200，即请求成功
            if (response.isOk()) {
                log.info("邮件发送成功");
                return true;
            } else {
                log.error("邮件发送失败：" + response.body());
                return false;
            }
        } catch (Exception e) {
            log.error("发送邮件时发生异常", e);
            return false;
        }
    }


    /**
     * 发送邮件 - 可携带附件
     *
     * @param toEmail 收件人邮箱
     * @param subject 邮件主题
     * @param text    邮件正文（纯文本）
     * @param html    邮件正文（HTML格式）
     * @param map     key为文件名(包含后缀！！！！！)比如：test.pdf，value为文件url路径
     * @return 发送成功返回true，失败返回false
     */
    public static boolean sendEmail(String toEmail, String subject, String text, String html, Map<String, String> map) {
        // 设置请求参数
        Map<String, Object> form = new HashMap<>();
        form.put("from", FROM_EMAIL); // 发件人邮箱
        form.put("to", toEmail); // 收件人邮箱
        form.put("subject", subject); // 邮件主题

        // 如果提供了纯文本内容，则添加到参数中
        if (StrUtil.isNotBlank(text)) {
            form.put("text", text);
        }
        // 如果提供了HTML内容，则添加到参数中
        if (StrUtil.isNotBlank(html)) {
            form.put("html", html);
        }

        // 构建请求URL
        String url = StrUtil.format("{}{}/messages", MAILGUN_API_BASE_URL, MAILGUN_DOMAIN);

        // 创建一个HttpRequest对象
        HttpRequest request = HttpRequest.post(url)
                .basicAuth("api", MAILGUN_API_KEY) // 添加HTTP基本认证
                .form(form); // 添加基本邮件内容

        //如果传入了文件
        if (ObjectUtil.isNotEmpty(map)) {
            //循环获取
            for (String name : map.keySet()) {
                //name为文件名 - value为文件的url地址
                String urlAddress = map.get(name);
                File tempFile = null;
                try {
                    // 从URL下载文件到输入流
                    URL urlObj = new URL(urlAddress);
                    InputStream inputStream = urlObj.openStream();
                    // 创建一个临时文件
                    tempFile = File.createTempFile("attachment_", name);
                    // 使用文件输出流写入临时文件
                    try (FileOutputStream outputStream = new FileOutputStream(tempFile)) {
                        IoUtil.copy(inputStream, outputStream);
                    }
                    // 将临时文件添加为附件
                    request.form("attachment", tempFile, name);
                } catch (Exception e) {
                    System.err.println("下载或添加附件时发生错误：" + e.getMessage());
                    e.printStackTrace();
                    return false;
                } finally {
                    // 邮件发送后删除临时文件
                    if (tempFile != null) {
                        tempFile.deleteOnExit();
                    }
                }
            }
        }


        try {
            // 发送邮件请求
            HttpResponse response = request.execute();
            // 判断响应状态码是否为200，即请求成功
            if (response.isOk()) {
                System.out.println("邮件发送成功");
                return true;
            } else {
                System.err.println("邮件发送失败：" + response.body());
                return false;
            }
        } catch (Exception e) {
            System.err.println("发送邮件时发生异常");
            e.printStackTrace();
            return false;
        }
    }


    // 测试邮件发送工具类
    public static void main(String[] args) throws Exception {
        //"984692891@qq.com,2524536977@qq.com".split(",").toString()
        boolean b = sendEmail("xxx", "BBBBBBBBBBB", "null", null);
        System.out.println(b);

    }

}
